﻿///////////////////////////////////////////////////////////////
//                                                           //
// Code from Arcanea Project.                                //
//                                                           //
// Please include this license part to every reproduction    //
//   of code.                                                //
//                                                           //
// This code is under Ms-RL license                          //
//                                                           //
// Please read futher information about the license,         //
//   the project (news and updates) and the                  //
//   contributors on the address :                           //
//     http://www.codeplex.com/Arcanea/                      //
//                                                           //
///////////////////////////////////////////////////////////////
using System;
using System.Collections.Generic;
//using System.Linq;
using System.Text;
using System.Reflection;
using log4net;

namespace Arcanea.NetworkEngine.Abstract.Engines
{
    /// <summary>
    /// Contrat que doit respecter l'engine de création des trames
    /// avec par exemple l'ajout de CRC ou autre.
    /// </summary>
    public abstract class IFrameEngine
    {
        protected readonly int sizeInt = BitConverter.GetBytes((Int32)25546).Length;

        protected static readonly ILog logger = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);

        /// <summary>
        /// Construit une trame réseau avant de l'envoyer
        /// </summary>
        /// <param name="arrayUnbuilded">Tableau brut</param>
        /// <returns>Trame complète</returns>
        public abstract byte[] BuildFrame(byte[] arrayUnbuilded);

        /// <summary>
        /// Recupère une trame et reconstruit le tableau initial
        /// </summary>
        /// <param name="engine">Engine permettant la réception</param>
        /// <returns>Le tableau brut</returns>
        public abstract byte[] UnbuildFrame(IProtocoleEngine engine);

        /// <summary>
        /// Fusionne deux tableaux entre eux
        /// C'est le principe de la construction de trame :
        /// "Trame" = "Tableau brut" + "CRC"
        /// </summary>
        /// <param name="a">Tableau en tete</param>
        /// <param name="b">Tableau en queue</param>
        /// <returns>a + b (concaténé)</returns>
        protected static byte[] FusionArray(byte[] a, byte[] b)
        {
            if (a == null || a.Length == 0) return b;
            if (b == null || b.Length == 0) return a;
            byte[] res = new byte[a.Length + b.Length];

            Array.Copy(a, 0, res, 0, a.Length);
            Array.Copy(b, 0, res, a.Length, b.Length);

            return res;
        }
    }
}
